//
// Bug-422 test case by lhunath
// http://code.google.com/p/cocos2d-iphone/issues/detail?id=422
//

#include "Bug-422.h"

bool Bug422Layer::init()
{
    if (BugsTestBaseLayer::init())
    {
		reset();
        return true;
	}

	return false;
}

void Bug422Layer::reset()
{
	static int localtag = 0;
	localtag++;

	// TO TRIGGER THE BUG:
	// remove the itself from parent from an action
	// The menu will be removed, but the instance will be alive
	// and then a new node will be allocated occupying the memory.
	// => CRASH BOOM BANG
	CCNode *node = getChildByTag(localtag-1);
	CCLog("Menu: %p", node);
	removeChild(node, false);
//	[self removeChildByTag:localtag-1 cleanup:NO];

    CCMenuItem *item1 = CCMenuItemFont::itemFromString("One", this, menu_selector(Bug422Layer::menuCallback));
	CCLog("MenuItemFont: %p", item1);
    CCMenuItem *item2 = CCMenuItemFont::itemFromString("Two", this, menu_selector(Bug422Layer::menuCallback));
    CCMenu *menu = CCMenu::menuWithItems(item1, item2, NULL);
	menu->alignItemsVertically();

	float x = CCRANDOM_0_1() * 50;
	float y = CCRANDOM_0_1() * 50;
	menu->setPosition(ccpAdd( menu->getPosition(), ccp(x,y)));
    addChild(menu, 0, localtag);	

    //[self check:self];
}

void Bug422Layer::check(CCNode* t)
{
	CCArray *array = t->getChildren();
    CCObject* pChild = NULL;
    CCARRAY_FOREACH(array, pChild)
    {
        CC_BREAK_IF(! pChild);
        CCNode* pNode = (CCNode*) pChild;
        CCLog("%p, rc: %d", pNode, pNode->retainCount());
        check(pNode);
    }
}

void Bug422Layer::menuCallback(CCObject* sender)
{
	reset();
}
